package com.atguigu.edu.service.impl;

import com.atguigu.edu.entity.EduCourse;
import com.atguigu.edu.entity.EduCourseDescription;
import com.atguigu.edu.mapper.EduCourseMapper;
import com.atguigu.edu.service.EduChapterService;
import com.atguigu.edu.service.EduCourseDescriptionService;
import com.atguigu.edu.service.EduCourseService;
import com.atguigu.edu.service.EduSectionService;
import com.atguigu.request.CourseCondition;
import com.atguigu.request.CourseInfoVO;
import com.atguigu.response.EduCourseConfirmVO;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;


/**
 * <p>
 * 课程 服务实现类
 * </p>
 *
 * @author HB
 * @since 2020-11-09
 */
@Service
public class EduCourseServiceImpl extends ServiceImpl<EduCourseMapper, EduCourse> implements EduCourseService {

    @Autowired
    private EduCourseDescriptionService eduCourseDescriptionService;
    /**
     * 想要在一张表中操作其他表 注入他们的service就可以对另外一张表进行crud
     * 他们的xxxserviceImpl就可以使用baseMapper对该表进行crud
     * 比如：下面的deleteCourseById方法中 在盖房中的baseMapper是操作的EduCourse表的
     * 想要操作：根据课程id删除章节信息，即想操作章节表 注入章节表的service,然后章节service的实现类impl中就可以使用basemapper操作章节表的crud了
     */
    @Autowired
    private EduChapterService eduChapterService;

    @Autowired
    private EduSectionService eduSectionService;
    /**
     * 向数据库中添加课程信息
     * 课程信息分为：课程基本信息 ，课程描述信息
     * @param courseInfoVO
     * @return
     */
    @Override
    public String saveCourseInfo(CourseInfoVO courseInfoVO) {
        EduCourse eduCourse = new EduCourse();
        BeanUtils.copyProperties(courseInfoVO,eduCourse);
        //保存课程的基本信息
        baseMapper.insert(eduCourse);
        //保存课程的描述信息
        EduCourseDescription eduCourseDescription = new EduCourseDescription();
        //他们两张表公用一个id
        String eduCourseId = eduCourse.getId();
        eduCourseDescription.setId(eduCourseId);
        eduCourseDescription.setDescription(courseInfoVO.getDescription());
        eduCourseDescriptionService.save(eduCourseDescription);
        return eduCourseId;
    }

    @Override
    public void getCoursePageCondition(Page<EduCourse> page, CourseCondition courseCondition) {
        //获取每个查询参数
        String title = courseCondition.getTitle();
        String status = courseCondition.getStatus();
        QueryWrapper<EduCourse> wrapper = new QueryWrapper<>();
        //判断以上传递过来的参数是否为空
        if(StringUtils.isNotEmpty(title)){
            wrapper.like("title",title);
        }

        if(StringUtils.isNotEmpty(status)){
            wrapper.ge("status",status);
        }
        baseMapper.selectPage(page,wrapper);
    }

    /**
     * 根据id查询页面所需的课程信息，并不需要所有的课程信息
     * @param id
     * @return
     */
    @Override
    public CourseInfoVO queryCourseById(String id) {
        CourseInfoVO courseInfoVO = new CourseInfoVO();
        //返回值是EduCourse 需要创造返回值的条件 将查询到的eduCourse赋值给courseInfoVO
        EduCourse eduCourse = baseMapper.selectById(id);
        BeanUtils.copyProperties(eduCourse,courseInfoVO);

        //查询课程描述信息
        EduCourseDescription courseDescription =eduCourseDescriptionService.getById(id);
        if(courseDescription!=null){
            //这里没设置的话 全端的课程简介会为空
            courseInfoVO.setDescription(courseDescription.getDescription());
        }
        return courseInfoVO;
    }


    /**
     * 更新课程
     * 更新操作是和添加操作极度相似的 可以直接复制添加的过来修改
     * @param courseInfoVO
     */
    @Override
    public void updateCourseInfo(CourseInfoVO courseInfoVO) {
        EduCourse eduCourse = new EduCourse();
        BeanUtils.copyProperties(courseInfoVO,eduCourse);
        //更新课程的基本信息
        baseMapper.updateById(eduCourse);
        //更新课程的描述信息
        EduCourseDescription eduCourseDescription = new EduCourseDescription();
        eduCourseDescription.setDescription(courseInfoVO.getDescription());
        eduCourseDescriptionService.updateById(eduCourseDescription);
    }

    @Override
    public EduCourseConfirmVO coursePublishConfirmInfo(String courseId) {
        EduCourseConfirmVO courseConfirmVO=  baseMapper.coursePublishConfirmInfo(courseId);
        return courseConfirmVO;
    }

    /**
     * 根据课程id 删除课程的所有信息
     *  @Transactional 事务 下面任何一步出错都会失败
     * @param courseId
     */
    @Transactional
    @Override
    public void deleteCourseById(String courseId) {
        //根据课程id删除章节信息
        eduChapterService.deleteChapterByCourseId(courseId);
        //根据课程id删除小结
        eduSectionService.deleteSectioByCourseId(courseId);

        //删除该课程对应的基本信息
        baseMapper.deleteById(courseId);
        //删除该课程对应的描述信息  描述信息的表和基本信息的表公用一个课程id 所以可以直接使用service中的removeById
        //eduCourseDescriptionService.deleteDescriptionByCourseId(courseId);
        eduCourseDescriptionService.removeById(courseId);
        //整个过程保证事务的完整性
    }


}
